home *** CD-ROM | disk | FTP | other *** search
- /*┌───────────────────────────────────────────────────────────────────────┐
- │ │
- │ Module: PDXTBL.CPP │
- │ Author: Rick Kligman │
- │ Purpose: Code for Base Class table which handles Paradox Engine │
- │ Database stuff │
- │ Last Modified: 05-17-91 00:34am │
- │ │
- │ Copyright 1991 Rick Kligman │
- │ This code may be freely used and distributed in commercial apps │
- │ provided some mention of PXBuddy++ is made in the documentation. │
- │ │
- │ Version 1.00 │
- └───────────────────────────────────────────────────────────────────────┘ */
-
- #include "pdxtbl.hpp"
-
- #define Uses_MsgBox
- #include <tv.h> // added for messageBox support
-
- // ╓───────────────────────────────────────────────────────────────╖
- // ║ Constructor for pxtable class ║
- // ╚═══════════════════════════════════════════════════════════════╝
-
- pxtable::pxtable()
- {
- first_open = 1; // this will be first time table is opened
- tbl_open = 0; // table is not open
- blanks_as_zeros = TRUE; // write blanks as zeros
- }
-
- // ╓───────────────────────────────────────────────────────────────╖
- // ║ Destructor for pxtable class ║
- // ╚═══════════════════════════════════════════════════════════════╝
-
- pxtable::~pxtable()
- {
- if ( ! first_open )
- delete fldptr;
- if ( tbl_open )
- PXTblClose(th);
- }
-
- // ╓───────────────────────────────────────────────────────────────╖
- // ║ Open a Table ║
- // ╚═══════════════════════════════════════════════════════════════╝
-
- int pxtable::open(char *tablename, FIELDHANDLE fh)
- {
- int err;
-
- if ( *tablename != NULL) {
- strcpy(tblname, tablename);
- if (! first_open)
- delete fldptr;
- first_open = 1;
- }
-
- err = PXTblOpen(tblname, &th, fh, 0);
- CKERR;
- err = PXRecBufOpen(th, &rh);
- if ( ! err ) {
- err = PXRecBufEmpty(rh);
- if ( ! err )
- if ( first_open ) {
- err = PXRecNFlds(th, &numflds);
- if ( ! err ) {
- fldptr = new absfld * [numflds + 1];
- first_open = 0;
- init_flds();
- PXKeyNFlds(th, &keyed); // determine if table is keyed
- }
- }
- }
-
- if ( err )
- PXTblClose(th);
- else
- tbl_open = 1; // table is now open
-
- return err; // will be PXSUCCESS if everything is OK
- }
-
- // ╓───────────────────────────────────────────────────────────────╖
- // ║ Close a Table ║
- // ╚═══════════════════════════════════════════════════════════════╝
-
- int pxtable::close()
- {
- int err;
-
- err = PXRecBufClose(rh);
- CKERR;
-
- err = PXTblClose(th);
-
- if ( ! err )
- tbl_open = 0; // table is now closed
-
- return err;
- }
-
- // ╓───────────────────────────────────────────────────────────────╖
- // ║ Read the record and then ALL fields in a Table ║
- // ╚═══════════════════════════════════════════════════════════════╝
-
- int pxtable::read_rec()
- {
- int err;
-
- err = recget();
- CKERR;
-
- err = read_flds();
-
- return err;
- }
-
- // ╓───────────────────────────────────────────────────────────────╖
- // ║ Read ALL fields in a Table ║
- // ╚═══════════════════════════════════════════════════════════════╝
-
- int pxtable::read_flds()
- {
- int err;
-
- PXNetTblRefresh(th); //aff
- for (int i = 0; fldptr [i] != NULL; i++) {
- err = fldptr [i]->get();
- CKERR;
- }
-
- return (PXSUCCESS);
- }
-
- // ╓───────────────────────────────────────────────────────────────╖
- // ║ Write ALL fields in a Table and then the record ║
- // ╚═══════════════════════════════════════════════════════════════╝
- // put
- /* int pxtable::recupdate()
- {
-
- int err;
-
- err = put_flds();
- CKERR;
-
- err = PXRecUpdate(th, rh);
- return err;
- }*/
-
- // changed recupdate as per PDOX engine users guide for record locking
- // pg. 85 Engine User's guide
- // 2-19-92
- int pxtable::recupdate()
- {
- int iLock;
- int answer=0;
-
- iLock = PXNetRecLock(th, &lh);
- switch(iLock)
- {
- case PXERR_RECDELETED: answer = deletedRec();
- break;
- case PXSUCCESS: answer=updateRec();
- break;
- default: messageBox(PXErrMsg(iLock), mfError);
- answer=FALSE;
- break;
- }
- return(answer);
- }
- // =====================================================================
- int pxtable::updateRec()
- {
- int answer=0;
- int err;
-
- put_flds();
- if((err = PXRecUpdate(th, rh)) != PXSUCCESS)
- {
- messageBox(PXErrMsg(err), mfError);
- answer = FALSE;
- }
- if((err = PXNetRecUnlock(th, lh)) != PXSUCCESS)
- {
- messageBox(PXErrMsg(err), mfError);
- return FALSE;
- }
- return(answer);
- }
- // =====================================================================
- int pxtable::deletedRec()
- {
- ushort iUpdate;
- int answer=0, err;
-
- iUpdate = messageBox("Another User has deleted record\nInsert Record?", mfYesButton | mfNoButton);
- if(iUpdate == cmYes)
- {
- if((err = recappend() ) != PXSUCCESS)
- {
- messageBox(PXErrMsg(err), mfError);
- answer = FALSE;
- }
- else
- answer = TRUE;
- }
- return(answer);
- }
- // =====================================================================
- // ╓───────────────────────────────────────────────────────────────╖
- // ║ Write ALL fields in a Table and then the record ║
- // ╚═══════════════════════════════════════════════════════════════╝
- // put
- int pxtable::recappend()
- {
- int err;
-
- err = put_flds();
- CKERR;
- err = PXRecAppend(th, rh);
- return err;
- }
-
- // ╓───────────────────────────────────────────────────────────────╖
- // ║ Write ALL fields in a Table and then the record ║
- // ╚═══════════════════════════════════════════════════════════════╝
- // put
- int pxtable::recinsert()
- {
- int err;
-
- err = put_flds();
- CKERR;
- err = PXRecInsert(th, rh);
-
- // err = recinsert();
-
- return err;
- }
-
- // ╓───────────────────────────────────────────────────────────────╖
- // ║ Write ALL fields in a Table ║
- // ╚═══════════════════════════════════════════════════════════════╝
-
- int pxtable::put_flds()
- {
- int err;
- for (int i = 0; fldptr [i] != NULL; i++) {
- err = fldptr [i]->put();
- CKERR;
- }
-
- return (PXSUCCESS);
- }
-
- // ╓───────────────────────────────────────────────────────────────╖
- // ║ Get Next Record in the Table ║
- // ╚═══════════════════════════════════════════════════════════════╝
-
- int pxtable::recnext()
- {
- int err;
- PXNetTblRefresh(th); //aff
- err = PXRecNext(th);
- if ( err == PXERR_ENDOFTABLE ) {
- // err = PXSUCCESS;
- tblmarker = TRUE;
- }
- else
- tblmarker = FALSE;
-
- return err;
- }
-
- // ╓───────────────────────────────────────────────────────────────╖
- // ║ Get Prev Record in the Table ║
- // ╚═══════════════════════════════════════════════════════════════╝
-
-
- int pxtable::recprev()
- {
- int err;
- PXNetTblRefresh(th); //aff
- err = PXRecPrev(th);
- if ( err == PXERR_STARTOFTABLE ) {
- err = PXSUCCESS;
- tblmarker = TRUE;
- }
- else
- tblmarker = FALSE;
-
- return err;
- }
- // ==================================================================
- // ******** A. Frantz additions start here ***********************
- // ==================================================================
-
- int pxtable::recfirst()
- {
- int err;
- PXNetTblRefresh(th);
- err = PXRecFirst(th);
- if ( err == PXERR_STARTOFTABLE ) {
- err = PXSUCCESS;
- tblmarker = TRUE;
- }
- else
- tblmarker = FALSE;
-
- return err;
- }
- // ==================================================================
- int pxtable::reclast()
- {
- int err;
- PXNetTblRefresh(th);
- err = PXRecLast(th);
- if ( err == PXERR_ENDOFTABLE ) {
- err = PXSUCCESS;
- tblmarker = TRUE;
- }
- else
- tblmarker = FALSE;
-
- return err;
- }
- // ==================================================================
- int pxtable::recdelete()
- {
- int err;
- // PXNetTblRefresh(th); // if I refresh before delete and another user
- // deletes at same time 2 records get deleted
- // this solved it logically
- err = PXRecDelete(th);
- return err;
- }
- // ==================================================================
- int pxtable::recget()
- {
- int err;
- PXNetTblRefresh(th);
- err = PXRecGet(th, rh);
- return err;
- }
- // ==================================================================